| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273 |
- import { NextRequest, NextResponse } from "next/server";
- async function handle(
- req: NextRequest,
- { params }: { params: { action: string; key: string[] } },
- ) {
- const requestUrl = new URL(req.url);
- const endpoint = requestUrl.searchParams.get("endpoint");
- if (req.method === "OPTIONS") {
- return NextResponse.json({ body: "OK" }, { status: 200 });
- }
- const [...key] = params.key;
- // only allow to request to *.upstash.io
- if (!endpoint || !new URL(endpoint).hostname.endsWith(".upstash.io")) {
- return NextResponse.json(
- {
- error: true,
- msg: "you are not allowed to request " + params.key.join("/"),
- },
- {
- status: 403,
- },
- );
- }
- // only allow upstash get and set method
- if (params.action !== "get" && params.action !== "set") {
- console.log("[Upstash Route] forbidden action ", params.action);
- return NextResponse.json(
- {
- error: true,
- msg: "you are not allowed to request " + params.action,
- },
- {
- status: 403,
- },
- );
- }
- const targetUrl = `${endpoint}/${params.action}/${params.key.join("/")}`;
- const method = req.method;
- const shouldNotHaveBody = ["get", "head"].includes(
- method?.toLowerCase() ?? "",
- );
- const fetchOptions: RequestInit = {
- headers: {
- authorization: req.headers.get("authorization") ?? "",
- },
- body: shouldNotHaveBody ? null : req.body,
- method,
- // @ts-ignore
- duplex: "half",
- };
- console.log("[Upstash Proxy]", targetUrl, fetchOptions);
- const fetchResult = await fetch(targetUrl, fetchOptions);
- console.log("[Any Proxy]", targetUrl, {
- status: fetchResult.status,
- statusText: fetchResult.statusText,
- });
- return fetchResult;
- }
- export const POST = handle;
- export const GET = handle;
- export const OPTIONS = handle;
- export const runtime = "edge";
|